package com.qdlc.p2p.dal.dao;

import java.util.List;

import com.qdlc.p2p.dal.common.dao.BaseDao;
import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.BondTender;
import com.qdlc.p2p.dal.dto.BorrowTender;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.dto.UserRedEnvelope;
import com.qdlc.p2p.dal.model.UserRedEnvelopeModel;

/**
 * 用户红包获取记录DAO接口
 * @author ylx
 * @version 2.0
 * @since 2015年04月22日 13时53分30秒
 */
public interface UserRedEnvelopeDao extends BaseDao<UserRedEnvelope> {

    /**
     * 查询用户红包获取记录
     * 
     * @param id 主键ID
     * @return用户红包获取记录实体
     */
    UserRedEnvelope getUserRedEnvelopeById(long id);
    
    /**
	 * 把用户红包置为无效
	 * 
	 * @param id 用户红包主键ID
	 */
	void doInvalid(long id);
	
	/**
	 * 分页查询用户红包记录
	 * 
	 * @param model UserRedEnvelopeModel
	 * @return PageDataList<UserRedEnvelopeModel>
	 */
	PageDataList<UserRedEnvelopeModel> list(UserRedEnvelopeModel model);
	
	/**
	 * 根据用户ID获取可使用红包列表
	 * 
	 * @param userId 查询用户ID
	 * @return List<UserRedEnvelopeModel>
	 */
	List<UserRedEnvelope> useableList(long userId);
	
	/**
	 * 根据用户ID获取可使用红包个数
	 * 
	 * @param userId
	 * @return 红包个数
	 */
	int userableCount(long userId);

    boolean checkCanUseRedEnvelope(long[] redEnvelopeIds, long userId, byte redType);

	/**
	 * 根据用户ID获取不可使用红包列表
	 * 
	 * @param userId 查询用户ID
	 * @return List<UserRedEnvelope>
	 */
	List<UserRedEnvelope> notAvailableList(long userId);
	
	/**
	 * 根据ID获取选择使用红包的值
	 * 
	 * @param redEnvelopeIds 红包ID集合
	 * @param toUserId 用户
	 * @return 红包总额
	 */
	double getTotalAmountByIds(long[] redEnvelopeIds, long toUserId);
	
	/**
	 * 获取用户投标使用红包金额
	 * 
	 * @param tenderId
	 * @return
	 */
	double getTenderUseAmount(long tenderId);
	
	
	/**
	 * 投资借款标冻结红包
	 * 
	 * @param borrowTender 投标对象
	 * @param redEnvelopeIds 红包ID集合
	 */
	void tenderBorrowFreezeRedEnvelope(BorrowTender borrowTender, long[] redEnvelopeIds);
	
	/**
	 * 投资借款标使用红包
	 * 
	 * @param tenderId
	 */
	void tenderBorrowUseRedEnvelope(long tenderId);
	
	/**
	 * 投资借款标失败红包还原
	 * 
	 * @param borrowTender 投标对象
	 */
	void tenderBorrowFailUseRedEnvelope(BorrowTender borrowTender);
	
	/**
	 * 根据使用类型和外键ID获取红包总额
	 * 
	 * @param useType 使用类型
	 * @param keyId 外键ID
	 * @return
	 */
	double getTotalAmountByUseTypeANdKeyId(String useType, long keyId);
	
	/**
	 * 购买债权转让使用红包
	 * 
	 * @param bondTender 债权转让购买对象
	 * @param redEnvelopeIds 红包id集合
	 */
	void tenderBondUseRedEnvelope(BondTender bondTender, long[] redEnvelopeIds);
	
	/**
	 * 购买债权转让失败红包还原
	 * 
	 * @param bondTender 债权转让购买对象
	 * @param redEnvelopeIds 红包id集合
	 */
	void tenderBondFailUseRedEnvelope(BondTender bondTender);
	
	/**
	 * 根据时间获取红包总额
	 * @param date
	 * @return
	 */
	double getUserRedPacketFeeByDate(String date);
	
	/**
	 * 校验所选择红包是否均为现金红包
	 * 
	 * @param redEnvelopeIds 红包ID集合
	 * @param toUser 用户
	 * @return
	 */
	boolean checkIsCashRedEnvelope(long[] redEnvelopeIds, User toUser);
	
	/**
	 * 校验所选择红包是否过期
	 * 
	 * @param redEnvelopeIds 红包ID集合
	 * @param toUser 用户
	 * @return
	 */
	boolean checkIsOverdueEnvelope(long[] redEnvelopeIds, User toUser);
	
	/**
	 * 红包置为使用
	 *
     * @param ids 红包ID集合
	 * @param useType 使用类型
     * @param preStatus 前状态
     * @param keyId 关联KeyId 如：投标 则标的ID
	 */
    int doUse(List<Long> ids, String useType, byte preStatus, Long keyId);

    /**
     * @param redEnvelopeIds
     * @param preStatus
     * @param aftStatus
     * @return
     */
    int changeStatus(long[] redEnvelopeIds, int preStatus, int aftStatus);

	/**
	 * 红包过期处理
	 */
	void redEnvelopeExpireDispose();
	
	/**
	 * 检测用户使用的红包状态
	 * 
	 * @param redEnvelopeIds
	 * @param user
	 * @return
	 */
	boolean checkRedEnvelope(long[] redEnvelopeIds, User user);
	/**
	 * 根据状态查询对应 红包总额
	 * @param status
	 * @return
	 */
	double getUseRedEnvelopeSumByStatus(int status,String date);
}
